package com.vxdata.utils.modules.逆向工程.swagge接口转md;

import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.JSONWriter;
import com.vxdata.utils.modules.逆向工程.swagge接口转md.vo.ColInfoVo;


import java.util.List;
import java.util.Map;
import java.util.Random;

public class SwaggerResultListToShiLiJson {

    /**
     * 获取JSON格式示例数据
     *
     * @param resultList 字段列表
     * @return JSON格式的示例数据
     */
    public static String getShiLi(List<ColInfoVo> resultList) {
        JSONObject exampleJson = new JSONObject();

        for (ColInfoVo colInfo : resultList) {
            String colName = colInfo.getColName();
            String type = colInfo.getType();
            // 根据字段类型生成随机示例值
            Object exampleValue = generateRandomExampleValue(colName, type);
            // 将字段名和示例值添加到 JSON 对象中
            exampleJson.put(colName, exampleValue);
        }
        // 将 JSONObject 转换为格式化的 JSON 字符串
        String jsonString = exampleJson.toJSONString(JSONWriter.Feature.PrettyFormat);
        return jsonString;
    }


    /**
     * 去除 data.records. 包含现场
     *
     * @param jsonStr
     * @return
     */
    public static String geshihua(String jsonStr) {
        JSONObject exampleJson = JSONObject.parseObject(jsonStr);

        // 创建新的目标 JSON 对象
        JSONObject targetObject = new JSONObject();
        // 设置 code 和 msg
        targetObject.put("code", 200);
        targetObject.put("msg", "请求成功");
        // 分页
        if (exampleJson.containsKey("data.records")) {
            // 处理 data 部分
            JSONObject newData = new JSONObject();
            // 设置 data.current, data.size, data.total
            newData.put("current", 1);
            newData.put("size", 10);
            newData.put("total", 99);

            // 处理 data.records 部分（动态解析）
            JSONObject record = new JSONObject();

            // 遍历原始 JSON 的所有键值对
            for (Map.Entry<String, Object> entry : exampleJson.entrySet()) {
                String key = entry.getKey();
                Object value = entry.getValue();

                // 如果键以 "data.records." 开头，则提取字段名并添加到 record 中
                if (key.startsWith("data.records.")) {
                    String fieldName = key.substring("data.records.".length()); // 去掉前缀
                    record.put(fieldName, value);
                }
            }
            // 将记录放入数组中
            newData.put("records", new Object[]{record});
            // 将 newData 添加到目标对象
            targetObject.put("data", newData);
        } else {
            JSONObject data = new JSONObject();
            // 遍历原始 JSON 的所有键值对
            for (Map.Entry<String, Object> entry : exampleJson.entrySet()) {
                String key = entry.getKey();
                Object value = entry.getValue();

                // 如果键以 "data.records." 开头，则提取字段名并添加到 record 中
                if (key.startsWith("data.")) {
                    String fieldName = key.substring("data.".length()); // 去掉前缀
                    data.put(fieldName, value);
                }
            }
            targetObject.put("data", data);
        }
        String jsonString = targetObject.toJSONString(JSONWriter.Feature.PrettyFormat);
        return jsonString;
    }

    /**
     * 根据字段类型生成随机示例值
     *
     * @param type 字段类型
     * @return 示例值
     */
    private static Object generateRandomExampleValue(String colName, String type) {
        if (colName.equals("code")) {
            return 200;
        }
        if (colName.equals("msg")) {
            return "请求成功";
        }
        if (colName.equals("idList")) {
            return "1,2,3,4,5";
        }
        Random random = new Random();
        if ("String".equalsIgnoreCase(type)) {
            return generateRandomString(random, 8); // 随机生成长度为8的字符串
        } else if ("Integer".equalsIgnoreCase(type) || "int".equalsIgnoreCase(type)) {
            return random.nextInt(1000); // 随机生成一个0到999之间的整数
        } else if ("Long".equalsIgnoreCase(type)) {
            return random.nextLong() % 1000000000L; // 随机生成一个长整型（范围：-10亿到10亿）
        } else if ("Double".equalsIgnoreCase(type) || "Float".equalsIgnoreCase(type)) {
            return random.nextDouble() * 1000; // 随机生成一个小数（范围：0到1000）
        } else if ("Boolean".equalsIgnoreCase(type)) {
            return random.nextBoolean(); // 随机生成true或false
        } else if ("Date".equalsIgnoreCase(type)) {
            return generateRandomDate(random); // 随机生成日期
        } else {
            return type;
        }
    }

    /**
     * 随机生成指定长度的字符串
     *
     * @param random 随机数生成器
     * @param length 字符串长度
     * @return 随机字符串
     */
    private static String generateRandomString(Random random, int length) {
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            sb.append(characters.charAt(random.nextInt(characters.length())));
        }
        return sb.toString();
    }

    /**
     * 随机生成日期字符串（格式：yyyy-MM-dd）
     *
     * @param random 随机数生成器
     * @return 随机日期字符串
     */
    private static String generateRandomDate(Random random) {
        int year = 2000 + random.nextInt(25); // 随机生成年份（2000到2024）
        int month = 1 + random.nextInt(12); // 随机生成月份（1到12）
        int day = 1 + random.nextInt(28); // 随机生成日期（1到28，避免闰月问题）
        return String.format("%d-%02d-%02d", year, month, day);
    }

    // 测试方法
    public static void main(String[] args) {
        List<ColInfoVo> resultList = java.util.Arrays.asList(
                new ColInfoVo("name", "String", "姓名"),
                new ColInfoVo("age", "Integer", "年龄"),
                new ColInfoVo("isStudent", "Boolean", "是否是学生"),
                new ColInfoVo("birthDate", "Date", "出生日期")
        );

        String jsonExample = getShiLi(resultList);
        System.out.println(jsonExample);
    }
}

